package main.old.new_2023.last.month_7;


/**
 * @Description:
 * todo 2. 两数相加
 * 给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出 和为目标值 target  的那 两个 整数，并返回它们的数组下标。
 * 你可以假设每种输入只会对应一个答案。但是，数组中同一个元素在答案里不能重复出现。
 * 你可以按任意顺序返回答案。
 *
 * @Author: Take-off
 * @Date: 1:00 PM 2023/6/5
 * @Param:
 * @return:
 **/
public class Solution0702 {
      public class ListNode {
      int val;
    ListNode next;
      ListNode() {}
      ListNode(int val) { this.val = val; }
        ListNode(int val, ListNode next) { this.val = val; this.next = next; }
  }
    //两数之和
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 创建一个虚拟头节点【不要动他】
        ListNode vir = new ListNode();
        // 创建一个指针指向头节点【动他】
        ListNode pre = vir;
        // 定义一个变量表示进位
        int cur = 0;
        // 遍历两个链表，直到都为空
        while (l1!= null || l2!= null){
            // 取出两个链表的当前值，如果为空则为0【① 取出加数 被加数】
            int l1Value = l1 == null ? 0 : l1.val;
            int l2Value = l2 == null ? 0 : l2.val;
            // 计算两个值的和，加上进位【② 先求和：加数+被加数+进位】
            int sumValue = l1Value + l2Value+cur;
            // 更新进位，如果和大于等于10，则进位为1，否则为0【③ 再更新进位carry，只有两个取值1,0】
            cur = sumValue >= 10 ? 1:0;
            // 创建一个新的节点，存储和的个位数【④ 最后节点存入结果（链表）sum的个位】
            pre.next = new ListNode(sumValue % 10);
            //            =========    循环指针更新    =============
            // 移动指针到下一个节点
            pre = pre.next;
            // 如果链表不为空，则移动到下一个节点
            if (l1 != null){
                l1 = l1.next;
            }
            if (l2 != null){
                l2 = l2.next;
            }
        }
        // 如果最后还有进位，则在末尾添加一个节点【把多的那个进位 存上】
        if (cur == 1){
            pre.next = new ListNode(cur);
        }
        // 返回虚拟头节点的下一个节点，即真正的头节点
        return vir.next;
    }

}
